/*
 * @Author: wuzhouhai wzh200x@126.com
 * @Date: 2023-05-15 10:00:00
 * @LastEditors: wuzhouhai wzh200x@126.com
 * @LastEditTime: 2023-05-15 10:00:00
 * @FilePath: \hyperNexus\hyperNexusCommon\timeHelper.go
 * @Description: 时间处理工具函数
 */
package hyperNexusCommon

import (
	"time"
)

// 常用时间格式常量
const (
	// TimeFormatDefault 默认时间格式 2006-01-02 15:04:05
	TimeFormatDefault = "2006-01-02 15:04:05"
	// TimeFormatDate 日期格式 2006-01-02
	TimeFormatDate = "2006-01-02"
	// TimeFormatTime 时间格式 15:04:05
	TimeFormatTime = "15:04:05"
	// TimeFormatCompact 紧凑格式 20060102150405
	TimeFormatCompact = "20060102150405"
	// TimeFormatISO ISO格式 2006-01-02T15:04:05Z07:00
	TimeFormatISO = time.RFC3339
)

// GetCurrentTime 获取当前时间
func GetCurrentTime() time.Time {
	return time.Now()
}

// GetCurrentTimeMilliseconds 获取当前时间的毫秒时间戳
func GetCurrentTimeMilliseconds() int64 {
	return time.Now().UnixNano() / 1e6
}

// GetCurrentTimeString 获取当前时间字符串，默认格式为 2006-01-02 15:04:05
func GetCurrentTimeString() string {
	return FormatTime(GetCurrentTime(), TimeFormatDefault)
}

// GetCurrentTimeStringWithFormat 获取指定格式的当前时间字符串
func GetCurrentTimeStringWithFormat(format string) string {
	return FormatTime(GetCurrentTime(), format)
}

// FormatTime 将time.Time格式化为字符串
func FormatTime(t time.Time, format string) string {
	return t.Format(format)
}

// ParseTime 将字符串解析为time.Time
func ParseTime(timeStr string, format string) (time.Time, error) {
	return time.Parse(format, timeStr)
}

// ParseTimeDefault 使用默认格式(2006-01-02 15:04:05)解析时间字符串
func ParseTimeDefault(timeStr string) (time.Time, error) {
	return ParseTime(timeStr, TimeFormatDefault)
}

// TimeToUnix 将time.Time转换为Unix时间戳（秒）
func TimeToUnix(t time.Time) int64 {
	return t.Unix()
}

// TimeToUnixMilli 将time.Time转换为Unix时间戳（毫秒）
func TimeToUnixMilli(t time.Time) int64 {
	return t.UnixNano() / 1e6
}

// UnixToTime 将Unix时间戳（秒）转换为time.Time
func UnixToTime(unix int64) time.Time {
	return time.Unix(unix, 0)
}

// UnixMilliToTime 将Unix时间戳（毫秒）转换为time.Time
func UnixMilliToTime(unixMilli int64) time.Time {
	return time.Unix(0, unixMilli*1e6)
}

// FormatUnixTime 将Unix时间戳（秒）格式化为字符串
func FormatUnixTime(unix int64, format string) string {
	return FormatTime(UnixToTime(unix), format)
}

// FormatUnixTimeDefault 将Unix时间戳（秒）格式化为默认格式字符串
func FormatUnixTimeDefault(unix int64) string {
	return FormatUnixTime(unix, TimeFormatDefault)
}

// FormatUnixMilliTime 将Unix时间戳（毫秒）格式化为字符串
func FormatUnixMilliTime(unixMilli int64, format string) string {
	return FormatTime(UnixMilliToTime(unixMilli), format)
}

// FormatUnixMilliTimeDefault 将Unix时间戳（毫秒）格式化为默认格式字符串
func FormatUnixMilliTimeDefault(unixMilli int64) string {
	return FormatUnixMilliTime(unixMilli, TimeFormatDefault)
}

// AddDuration 给时间添加指定时长
func AddDuration(t time.Time, d time.Duration) time.Time {
	return t.Add(d)
}

// AddSeconds 给时间添加指定秒数
func AddSeconds(t time.Time, seconds int) time.Time {
	return AddDuration(t, time.Duration(seconds)*time.Second)
}

// AddMinutes 给时间添加指定分钟数
func AddMinutes(t time.Time, minutes int) time.Time {
	return AddDuration(t, time.Duration(minutes)*time.Minute)
}

// AddHours 给时间添加指定小时数
func AddHours(t time.Time, hours int) time.Time {
	return AddDuration(t, time.Duration(hours)*time.Hour)
}

// AddDays 给时间添加指定天数
func AddDays(t time.Time, days int) time.Time {
	return AddDuration(t, time.Duration(days)*24*time.Hour)
}

// GetStartOfDay 获取一天的开始时间 (00:00:00)
func GetStartOfDay(t time.Time) time.Time {
	year, month, day := t.Date()
	return time.Date(year, month, day, 0, 0, 0, 0, t.Location())
}

// GetEndOfDay 获取一天的结束时间 (23:59:59)
func GetEndOfDay(t time.Time) time.Time {
	year, month, day := t.Date()
	return time.Date(year, month, day, 23, 59, 59, 999999999, t.Location())
}

// GetStartOfWeek 获取一周的开始时间（周一 00:00:00）
func GetStartOfWeek(t time.Time) time.Time {
	weekday := int(t.Weekday())
	if weekday == 0 { // 周日
		weekday = 7
	}
	offset := weekday - 1 // 周一为一周的第一天
	return GetStartOfDay(AddDays(t, -offset))
}

// GetEndOfWeek 获取一周的结束时间（周日 23:59:59）
func GetEndOfWeek(t time.Time) time.Time {
	weekday := int(t.Weekday())
	if weekday == 0 { // 周日
		weekday = 7
	}
	offset := 7 - weekday // 周日为一周的最后一天
	return GetEndOfDay(AddDays(t, offset))
}

// GetStartOfMonth 获取一个月的开始时间（1号 00:00:00）
func GetStartOfMonth(t time.Time) time.Time {
	year, month, _ := t.Date()
	return time.Date(year, month, 1, 0, 0, 0, 0, t.Location())
}

// GetEndOfMonth 获取一个月的结束时间（月末 23:59:59）
func GetEndOfMonth(t time.Time) time.Time {
	year, month, _ := t.Date()
	lastDay := time.Date(year, month+1, 0, 23, 59, 59, 999999999, t.Location())
	return lastDay
}

// GetStartOfYear 获取一年的开始时间（1月1日 00:00:00）
func GetStartOfYear(t time.Time) time.Time {
	year, _, _ := t.Date()
	return time.Date(year, 1, 1, 0, 0, 0, 0, t.Location())
}

// GetEndOfYear 获取一年的结束时间（12月31日 23:59:59）
func GetEndOfYear(t time.Time) time.Time {
	year, _, _ := t.Date()
	return time.Date(year, 12, 31, 23, 59, 59, 999999999, t.Location())
}
